package com.gragra.sampling.binary.tests;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import org.junit.Before;
import org.junit.Test;
import com.gragra.data.MixingCorpus;
import com.gragra.sampling.ThreadedUniformAccess;
import com.gragra.sampling.binary.BinaryGibbs;
import com.gragra.sampling.binary.ToStringConverter;
import com.gragra.sampling.sequentialStructure.WordAndTagHolder;
import com.gragra.sequentiaDataGenerator.BaseGenerator;
import com.gragra.sequentiaDataGenerator.EmptySegmentation;
/**
 * 
 * @author Christoph Teichmann
 * 14.09.2013
 */
public class TestBinaryStructure
{
	/**
	 * 
	 */
	private BinaryGibbs bin;
	@Before
	public void setUp() throws Exception
	{
		StringReader sr = new StringReader("this|0 is|1 the|2 first|3 sentence|4");
		BufferedReader br = new BufferedReader(sr);
		BaseGenerator bg = new BaseGenerator(new EmptySegmentation());
		MixingCorpus<WordAndTagHolder> co = bg.createCorpus(br);
		bin = new BinaryGibbs(co.getEntry(0), 10, new ToStringConverter(10),true);
		ThreadedUniformAccess tua = new ThreadedUniformAccess(10);
		bin.initialize(null, tua);
		bin.subsume(0, 1, 5, 4);
		bin.subsume(2, 3, 6, 4);
		bin.subsume(6, 4, 7, 4);
		bin.subsume(5, 7, 8, 4);
		bin.setHeadDirection(1, true, 4);
		bin.setHeadDirection(2, false, 4);
		bin.setHeadDirection(3, false, 4);
		bin.setHeadDirection(4, true, 4);
	}
	@Test
	public void testGetHead() throws IOException
	{
		assertEquals(bin.getHeadPosition(0, 4),3);
		assertEquals(bin.getHeadPosition(1, 4),0);
		assertEquals(bin.getHeadPosition(2, 4),3);
		assertEquals(bin.getHeadPosition(3, 4),5);
		assertEquals(bin.getHeadPosition(4, 4),3);
		bin.setHeadDirection(1, false, 4);
		bin.setHeadDirection(2, true, 4);
		bin.flipLeft(bin.getRootPosition(), 4);
		assertEquals(bin.getHeadPosition(0, 4),1);
		assertEquals(bin.getHeadPosition(1, 4),5);
		assertEquals(bin.getHeadPosition(2, 4),3);
		assertEquals(bin.getHeadPosition(3, 4),1);
		assertEquals(bin.getHeadPosition(4, 4),1);
		bin.setHeadDirection(4, false, 4);
		assertEquals(bin.getHeadPosition(0, 4),1);
		assertEquals(bin.getHeadPosition(1, 4),4);
		assertEquals(bin.getHeadPosition(2, 4),3);
		assertEquals(bin.getHeadPosition(3, 4),1);
		assertEquals(bin.getHeadPosition(4, 4),5);
		bin.flipRight(bin.getRootPosition(), 4);
		assertEquals(bin.getHeadPosition(0, 4),1);
		assertEquals(bin.getHeadPosition(1, 4),5);
		assertEquals(bin.getHeadPosition(2, 4),3);
		assertEquals(bin.getHeadPosition(3, 4),4);
		assertEquals(bin.getHeadPosition(4, 4),1);
		StringReader sr = new StringReader("this|0 is|1 a|2 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 very|3 long|5 sentence|4");
		BufferedReader br = new BufferedReader(sr);
		BaseGenerator bg = new BaseGenerator(new EmptySegmentation());
		MixingCorpus<WordAndTagHolder> co = bg.createCorpus(br);
		bin = new BinaryGibbs(co.getEntry(0), 10, new ToStringConverter(10),true);
		bin.initialize(null, new ThreadedUniformAccess(10));
		bin.toString(0);
		bin.getHeadPosition(0, 4);
	}
	@Test
	public void testFlipOperations()
	{
		assertEquals(bin.toString(4).trim(),"( ( (0 this)<- (1 is) ) ( ( (2 the) (3 first)<- )<- (4 sentence) )<- )");
		bin.flipRight(8, 4);
		assertEquals(bin.toString(4).trim(),"( (0 this)<- ( (1 is) ( ( (2 the) (3 first)<- )<- (4 sentence) )<- ) )");
		bin.flipLeft(8, 4);
		assertEquals(bin.toString(4).trim(),"( ( (0 this)<- (1 is) ) ( ( (2 the) (3 first)<- )<- (4 sentence) )<- )");
		bin.flipRight(bin.getNodeSplittingAt(4, 4), 4);
		assertEquals(bin.toString(4).trim(),"( ( (0 this)<- (1 is) ) ( (2 the) ( (3 first)<- (4 sentence) )<- )<- )");
	}
	@Test
	public void testGetNodeSplittingAt()
	{
		assertEquals(bin.getNodeSplittingAt(4, 4),7);
		assertEquals(bin.getNodeSplittingAt(2, 4),8);
	}
	@Test
	public void testGetMiddle()
	{
		assertEquals(bin.getMiddle(7, 4),4);
		assertEquals(bin.getMiddle(8, 4),2);
	}
	@Test
	public void testGetRootPosition()
	{
		for(int i=0;i<10;++i)
		{assertEquals(bin.getRootPosition(),8);}
	}
	@Test
	public void testGetFrom()
	{assertEquals(bin.getFrom(7, 4),2);}
	@Test
	public void testGetTo()
	{assertEquals(bin.getTo(6, 4),4);}
	@Test
	public void testGetAbove()
	{assertEquals(bin.getAbove(6, 4),7);}
	@Test
	public void testGetDominated()
	{
		assertEquals(bin.getDominated(7, true, 4),6);
		assertEquals(bin.getDominated(7, false, 4),4);
	}
}